#pragma once

template <typename Idx, typename DType>
struct GATData {
  // feat_size size along feature dimension
  Idx feat_src_xlen{0};
  Idx feat_src_hidden{0};
  Idx heads{0};
  Idx ret_xlen{0};
  DType leaky_relu_slope;
  // edge indices
  Idx *eids;
  // Inputs
  DType *feat_src{nullptr}, *el{nullptr}, *er{nullptr};
  // Intermediates
  DType  *sum{nullptr}, *exp{nullptr};
  // Output
  DType *ret{nullptr};
};

template <typename Idx, typename DType>
struct RGCNData {
  Idx rels{0};
  Idx nfeat_len_in{0};
  Idx nfeat_len_out{0};
  // edge index
  Idx *eids;
  // edge type
  Idx *etypes;
  // Input feature
  DType *nfeat_src{nullptr}, *rweight{nullptr}, *enorm{nullptr};
  // Output feature
  DType *nfeat_out;
};

template <typename Idx>
struct CSRInfo {
    Idx rows;
    Idx nnz;
    Idx *row_offset;
    Idx *col_ind;
    /// optional if \code{row_ind} appears, the \code{rows} param matches \code{row_ind}
    Idx *row_ind;
};

template <typename Idx>
struct COOInfo {
    Idx rows;
    Idx nnz;
    Idx *src_id;
    Idx *dst_id;
};